作為一個 JavaScript 開發人員,不能不去理解程式碼的工作原理,只是期望或猜測它可以運行。
如果要避免問題(bug),唯一的辦法就是了解 JavaScript 在做甚麼。
在你腦補和真實code裡面發現分歧(divergence),代表有 bug 要發生了!
註:這個部分有點像 保哥很久以前寫過的文章 我要成為前端工程師!給 JavaScript 新手的建議與學習資源整理
很多寫 JS 的人都是「腦補」寫 code,從來沒有理解為什麼 code 可以執行,
所以一堆奇怪的bug。
對新手而言的「奇怪」,因為 JS 隨便寫都可以 run ,比較少會出現其他語言理解有錯,
不能編譯死給你看的狀況,所以因此出現神奇 bug 也很常見。
這邊先暫且不論理解整個 JavaScript,那會是一個很長久的學習,也是這個系列的目的。
但是,如果只是想要深入理解 ++ 運算子
,
其實就是把 spec 演算法寫成 code,
再比對看看自己實作的結果是不是原生 JS 結果一樣就好。
抽象運算子(abstract operations)
,抽象運算子
依照 spec 寫成 code =>
這邊可以知道, ++ 運算子
一定會先執行「型別轉換」成數字,
然後才會做 + 運算子
的 +1 。
所以才會產生 用 x++ 和 x = x+1 不一樣的問題。
*註:這邊 + 運算子
其實也有小雷,因為 + 運算子
會 overloading ,後面會提到 spec
Kyle Simpson 認為 JavaScript 有基礎三個核心支柱。
沒有人喜歡 Types,尤其是像 JavaScript 這樣的動態類型語言。
甚至有些人 (比如 Doug Crockford) 直接告訴你說不要管、不要用型別,但 Kyle Simpson 認為這樣是不負責的,你必須了解你使用的工具。
當然,你可以總是用 嚴格相等 (===)
來避免型別問題,但對型別不了解就是 bug 不知不覺產生的原因之一。
Coercion
避免中文誤導理解的問題)Scope
Lexical scopes(語彙範疇)、closure、modular pattern (模組)。
最多人寫文章的部分,或許大家都很熟悉了。
Kyle Simpson 用不一樣的方式讓聽眾重新理解,其實書上面也有寫(對話的方式),但是又有些改良。
Objects
這邊的 Objects
Oriented 不是物件導向(class oriented)的那個 OOP,是指 how JavaScript's objects system works
這邊特別強調 JS 的系統和 C++ , Java 不一樣,但故意做很像,導致大家理解都很怪。
Kyle Simpson 認為,基於「原型鍊」的 JS 能力更強,不應該被 物件導向(class oriented) 所侷限。
JS 可以用「語法糖」做出很像真的物件導向(class oriented) 的系統,但是 C++ , Java 做不出 JS 的原型鍊系統,所以從這個角度看 JS 原型鍊能力更強。
Kyle Simpson 一直不斷強調,你一定要「學」,但很多東西或許學會之後可以「不要用」。
其實 Kyle Simpson 有很多想法,應該都和現在主流不一樣,幾個我認為比較偏激的想法 :
嚴格相等 ===
代表你對 JS 理解不足,尤其是不理解 Coercion。其實寫慣 嚴格相等 ===
,寫慣 ES6 (let / const ,arrow function),很想直接跳過去不讀或快轉。
但是,如同系列標題說的: 打造全新 JavaScript Mindset ,你可以不跟隨 Kyle Simpson 的意見,但是不要抱著之前寫 code 的 Mindset 來理解 Kyle Simpson 的 JS 書籍
,或許可以放下過去的成見,試試用不同的角度理解 JS。
You absolutely should learn this system.
But you might not need some of it.
我一直有在追 Kyle Simpson 的推特,之前有看到嚴格相等跟 arrow function 那兩個說法,覺得很猛XD
猛的點在於直接跟主流意見不同並且有自己的論點,雖然論點本身我沒有很認同就是了XD
我自己卡很久,因為他講的時候都是說「之後會提到」,話說一半真的很靠杯
這邊是我自己的文章,我就先直接爆雷了 :P
我是蠻「認同論點」,但是我「一定不會」做,太白痴了 XDD
他自己也有說:你一定要「學」,但很多東西或許學會之後可以「不要用」。